import axios, {
  AxiosInstance,
  InternalAxiosRequestConfig,
  AxiosResponse
} from 'axios'
import { BASE_URL } from './baseURL'
import { dataFormat } from './dataFormatting'
import { ElMessage } from 'element-plus'

/**
 * API 响应数据接口
 */
export interface ApiResponse<T = any> {
  code: number
  msg: string
  data?: T
}

/**
 * 创建axios实例，对创建出的实例进行自定义配置（不会污染原始的axios实例）
 */
const instance: AxiosInstance = axios.create({
  // 基础路径
  baseURL: BASE_URL.dev,
  timeout: 600000, // 等待响应的最长时间60秒
  headers: { Accept: '*/*' }
})

// 自定义配置-请求/响应 拦截器
// 添加请求拦截器
instance.interceptors.request.use(
  async (
    config: InternalAxiosRequestConfig
  ): Promise<InternalAxiosRequestConfig> => {
    // 在发送请求之前做些什么
    // 这里可以添加认证token等逻辑
    return config
  },
  (error: any): Promise<any> => {
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function <T>(
    response: AxiosResponse<ApiResponse<T>>
  ): AxiosResponse<ApiResponse<T>> {
    // 2xx 范围内的状态码都会触发该函数
    // 对响应数据做点什么
    console.log('request.ts 响应数据:', dataFormat(response.data))
    if (response.data.code !== 1) {
      ElMessage.success(response.data.msg)
    }
    return response
  },
  function (error: any): Promise<any> {
    // 对响应错误做点什么
    const errorMessage = error.response?.data?.msg || '请求失败，请稍后重试'
    ElMessage({
      type: 'error',
      message: errorMessage,
      duration: 1000
    })
    return Promise.reject(error)
  }
)

/**
 * 通用请求方法，封装axios请求，直接返回data数据
 */
export async function request<T>(config: {
  method: string
  url: string
  data?: any
  params?: any
  headers?: any
}): Promise<ApiResponse<T>> {
  try {
    const response = await instance(config)
    return response.data as ApiResponse<T>
  } catch (error) {
    throw error
  }
}

// 导出配置好的实例
export default instance
